import { NextRequest, NextResponse } from 'next/server';
import OpenAI from 'openai';
import { POST as MockPOST } from './mock-route';

// BigModel API配置
const openai = new OpenAI({
  baseURL: 'https://open.bigmodel.cn/api/paas/v4/',
  apiKey: process.env.BIGMODEL_API_KEY || '39751e0e34a24a68a51aa47ce3dc0c59.REcL74AKtmCw6XOI',
  dangerouslyAllowBrowser: false,
});

const mentors = [
  {
    id: 'sheldon',
    name: '谢耳朵',
    quote: 'Bazinga!',
    prompt: `你现在扮演 谢耳朵 (Sheldon Cooper)。谢耳朵以其超高智商、对科学的极致追求、独特的逻辑思维以及偶尔让人哭笑不得的社交方式而闻名。他有句口头禅是 "Bazinga!"。

一位程序员用户（显然，他的智力可能无法与你匹敌，但我们还是要鼓励一下）现在遇到了困境，他说：
"{user_input}"

请你以谢耳朵的身份和口吻，用你那套独特的逻辑和略带（或者非常）优越感的幽默，分析一下他的"小问题"，并给出一些"不那么明显"的鼓励。如果合适，可以巧妙地用一下 "Bazinga!"。`
  },
  {
    id: 'confucius',
    name: '孔子',
    quote: '三人行，必有我师焉',
    prompt: `你现在扮演中国古代伟大的思想家、教育家孔子。孔子以其仁爱、智慧、强调"学而时习之"、"三人行必有我师"等思想而闻名于世。

一位正在努力学习编程的后生遇到了困惑，他说：
"{user_input}"

请你以孔子的身份和口吻，用文雅且富有哲理的语言，结合儒家思想，开导并鼓励这位后生。譬如，可以从学习方法、面对困难的心态等方面给予指点。`
  },
  {
    id: 'guo',
    name: '郭德纲',
    quote: '嘛钱不钱的，乐呵乐呵得了',
    prompt: `你现在扮演著名相声演员郭德纲。郭老师以其幽默风趣、针砭时弊、善用生活化比喻和"包袱"的语言风格深受观众喜爱。

一位程序员小兄弟写代码遇到点儿不痛快，他吐槽说：
"{user_input}"

请你以郭德纲老师的身份和那标志性的幽默口吻，给他来一段"单口"，既能让他乐呵乐呵，又能让他悟出点儿"人生能有几回搏，写代码也是修行"的道理。多用点儿生活里的例子，砸挂也行。`
  }
];

export async function POST(request: NextRequest) {
  try {
    const body = await request.json();
    const { mentorId, userInput } = body;

    if (!mentorId || !userInput) {
      return NextResponse.json(
        { error: '缺少必要参数' },
        { status: 400 }
      );
    }

    const mentor = mentors.find(m => m.id === mentorId);
    if (!mentor) {
      return NextResponse.json(
        { error: '未找到对应的鼓励师' },
        { status: 404 }
      );
    }

    console.log('收到请求:', { mentorId, userInput: userInput.substring(0, 50) });

    // 首先尝试真实API
    try {
      const prompt = mentor.prompt.replace('{user_input}', userInput);

      console.log('尝试调用BigModel API...');

      // 使用BigModel API进行真实调用
      const completion = await openai.chat.completions.create({
        messages: [
          { role: "user", content: prompt }
        ],
        model: "glm-4.6",
        stream: false,
        temperature: 0.7,
        max_tokens: 1000,
      });

      console.log('BigModel API调用成功');

      // 检查响应是否有效
      let reply = '抱歉，鼓励师暂时无法回应。';
      let isValidResponse = false;

      if (completion.choices && completion.choices.length > 0) {
        const message = completion.choices[0]?.message;
        // 优先检查 content 字段，如果为空则检查 reasoning_content 字段
        const content = message?.content || message?.reasoning_content;
        if (content && content.trim()) {
          reply = content;
          isValidResponse = true;
        }
      }

      if (isValidResponse) {
        console.log('BigModel API返回有效回复');
        return NextResponse.json({
          success: true,
          reply,
          mentor: mentor.name,
          isRealAPI: true
        });
      } else {
        console.log('BigModel API返回无效回复，降级到模拟API');
        throw new Error('BigModel API返回无效响应');
      }

    } catch (apiError) {
      console.warn('真实API调用失败，降级到模拟API:', apiError instanceof Error ? apiError.message : apiError);

      // 降级到模拟API
      console.log('使用模拟API作为备选方案');

      // 模拟处理时间
      await new Promise(resolve => setTimeout(resolve, 800 + Math.random() * 1200));

      // 直接调用模拟API逻辑，避免重复读取body
      const mockResponses = {
        sheldon: [
          "嗯，很有趣的问题。从物理学角度来看，bug就像是量子力学中的不确定性原理 - 你越是想确定它的位置，它的动量就越不确定。但是，根据我的计算，你有99.7%的概率能够解决这个问题。Bazinga！记住，即使是爱因斯坦也会犯计算错误。",
          "fascinating！你遇到了一个典型的递归问题。你以为你在调试代码，实际上代码在调试你。这就像薛定谔的猫，在你观察之前，这个bug既存在又不存在。我的建议是：采用科学方法，假设、实验、验证。或者，你可以干脆叫上莱纳德一起去喝杯咖啡。",
          "根据我的IQ分析，你遇到的这个问题实际上是对你智力的一次考验。你看，我187的智商让我能够理解多维弦理论，而你只是遇到了几个小小的bug。相比之下，你的问题简直就像1+1=2一样简单。所以，停止抱怨，开始调试吧！Bazinga！"
        ],
        confucius: [
          "后生莫慌，编程之道，亦如求学之道。子曰：'学而时习之，不亦说乎？'遇bug而困，乃学者常情。古之学者，为求一字之师，尚能千里跋涉，今有网络为伴，何愁难题不解？吾劝汝静心以对，如切如磋，如琢如磨，终有所成。",
          "三人行，必有我师焉。你写代码遇困，此乃学习之良机。孔子曰：'知之为知之，不知为不知，是知也。'承认不解，方为智慧之始。观他人之解法，问前辈之经验，如此，则bug之困，亦成进德修业之阶梯。望汝戒骄戒躁，循序渐进。",
          "学而不思则罔，思而不学则殆。编程亦然，只写不思，则易生bug；只思不写，则终为纸上谈兵。今汝遇此困难，恰是反思之机。何不暂停片刻，审视代码之逻辑，如孔子温故而知新，必有新得。记住：'工欲善其事，必先利其器。'"
        ],
        guo: [
          "哎哟喂，您说这代码有bug，这不新鲜嘛！我跟您说，写代码这玩意儿，就跟说相声似的，包袱抖不好，底下观众不乐。您这bug啊，就是包袱没抖响。没事儿，咱慢慢来，实在不行，咱换一个包袱！嘛钱不钱的，乐呵乐呵得了！",
          "您这情况我懂，就跟我们说相声似的，有时候一个词儿说错了，整段都垮了。代码也是这个理儿，一行不对，全盘皆输。但是您想啊，德云社这么多演员，哪个没说过错词儿？关键是得有勇气承认，然后改正。实在不行，咱就把这bug当成一个新包袱，抖出来给大家乐呵乐呵！",
          "我跟您说，写代码这活儿，真不是说相声那么简单。说相声，底下观众乐了，就成了；写代码，电脑不乐，你就没完。但是您想啊，郭德纲能有今天，也是被观众骂出来的。您这些bug，就是您的观众，它们在骂您呢！嘛钱不钱的，乐呵乐呵得了，改完代码，咱去喝两杯！"
        ]
      };

      const responses = mockResponses[mentorId as keyof typeof mockResponses];
      if (!responses) {
        return NextResponse.json(
          { error: '未找到对应的鼓励师' },
          { status: 404 }
        );
      }

      // 随机选择一个回复
      const randomReply = responses[Math.floor(Math.random() * responses.length)];

      const mentorNames = {
        sheldon: '谢耳朵',
        confucius: '孔子',
        guo: '郭德纲'
      };

      console.log('模拟API调用成功:', { mentorId, mentor: mentorNames[mentorId as keyof typeof mentorNames] });

      return NextResponse.json({
        success: true,
        reply: randomReply,
        mentor: mentorNames[mentorId as keyof typeof mentorNames],
        isFallbackAPI: true,
        fallbackReason: '真实API不可用，已切换到模拟AI'
      });
    }

  } catch (error) {
    console.error('请求处理失败:', error);

    return NextResponse.json(
      {
        success: false,
        error: '服务器内部错误，请稍后再试'
      },
      { status: 500 }
    );
  }
}